#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>

int main()
{
    
/////////////////////////////////////////////////////////追加重定向和输入重定向///////////////////////////////////////
    //int fd = open("log.txt", O_CREAT | O_WRONLY | O_APPEND, 0666); //追加
    int fd = open("log.txt", O_RDONLY); //输入
    
    if(fd < 0) exit(1);
    
    dup2(fd, 0); //重定向
    close(fd);

    //printf("fd: %d\n", fd);
    //printf("hello linux!\n");
    while(1)
    {
        char buffer[64];
        if(!fgets(buffer, sizeof(buffer), stdin)) break;
        printf("%s", buffer);
    }

///////////////////////////////////////////////////////输出重定向/////////////////////////////////////////    
   // int fd = open("log.txt", O_CREAT | O_WRONLY | O_TRUNC, 0666);
   // if(fd < 0) exit(1);
   // dup2(fd, 1);
   // close(fd);

   // printf("fd: %d\n", fd);
   // printf("stdout\n");
   // //printf("stdout\n");
   // //fprintf(stdout, "hello linux\n");
   // fprintf(stdout, "hello linux\n");
   // fprintf(stdout, "hello linux\n");

   // const char* s = "hello world!\n";
   // write(fd, s, strlen(s));


///////////////////////////////////////////////////文件描述符//////////////////////////////////////////////    
   // printf("stdin: %d\n", stdin->_fileno);
   // printf("stdout: %d\n", stdout->_fileno);
   // printf("stderr: %d\n\n", stderr->_fileno);
   // 
   // umask(0);
   // int fd1 = open("log1.txt", O_CREAT | O_WRONLY, 0666);
   // int fd2 = open("log2.txt", O_CREAT | O_WRONLY, 0666);
   // int fd3 = open("log3.txt", O_CREAT | O_WRONLY, 0666);
   // int fd4 = open("log4.txt", O_CREAT | O_WRONLY, 0666);
   // if(fd1 < 0) exit(1);
   // if(fd2 < 0) exit(1);
   // if(fd3 < 0) exit(1);
   // if(fd4 < 0) exit(1);

   // printf("fd1: %d\n", fd1);
   // printf("fd2: %d\n", fd2);
   // printf("fd3: %d\n", fd3);
   // printf("fd4: %d\n", fd4);

////////////////////////////////////////////////////读文件//////////////////////////////////////////
   // int fd = open("log.txt", O_RDONLY);  //读文件
   // if(fd < 0)
   // {
   //     perror("open");
   //     return 1;
   // }
   // while(1)
   // {
   //     char buffer[64];
   //     int ret = read(fd, &buffer, sizeof(buffer));
   //     if(ret > 0)  //读取成功
   //     {
   //         //buffer[ret] = 0;
   //         printf("%s", buffer);
   //     }
   //     else if(ret == 0) //读完了
   //     {
   //         break;
   //     }
   // }


/////////////////////////////////////////////写文件////////////////////////////////////////////////////
    //int fd = open("log.txt", O_CREAT | O_WRONLY, 0666);  //创建+只写
    //int fd = open("log.txt", O_CREAT | O_WRONLY | O_TRUNC, 0666);  //创建+只写+清空
    //int fd = open("log.txt", O_CREAT | O_WRONLY | O_APPEND, 0666);  //创建+追加写入
   // //const char* s = "hello linux\n";
   // const char* s = "asdf\n";
   // int n = 5;
   // int num = 1234567;
   // while(n--)
   // {
   //    // write(fd, s, strlen(s));
   //    // write(fd, &num, sizeof(num)); //乱码
   // 
   //     char buffer[16];
   //     snprintf(buffer, sizeof(buffer), "%d\n", num);
   //     write(fd, buffer, strlen(buffer));
   // }
   // close(fd);

    return 0;
}
